﻿using AutoMapper;
using ExcellentProjectPlus.Aplicacion.Calificaciones.Periodos;
using ExcellentProjectPlus.Dominio.Calificaciones.Entidades;
using Servicios.Calificaciones.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Description;

namespace Servicios.Calificaciones.Controllers
{
    public class PeriodosController : ApiController
    {
        #region Propiedades
        IServicioDeGestionDePeriodos _servicioDeGestionDePeriodos;
        #endregion

        #region Constructores
        public PeriodosController(IServicioDeGestionDePeriodos servicioDeGestionDePeriodos)
        {
            _servicioDeGestionDePeriodos = servicioDeGestionDePeriodos;
            //Mapping handling
            Mapper.CreateMap<Periodo, PeriodoModel>();
            Mapper.CreateMap<Parcial, ParcialModel>();
        }
        #endregion
        [HttpGet()]
        [Route("api/periodos")]
        public IHttpActionResult Get()
        {
            return Ok(Mapper.Map<IEnumerable<Periodo>, IEnumerable<PeriodoModel>>(_servicioDeGestionDePeriodos.ObtenerPeriodos()));
        }

        [HttpGet()]
        [ResponseType(typeof(PeriodoModel))]
        [Route("api/periodos/{id}")]
        public IHttpActionResult GetPeriodo(int id)
        {
            Periodo periodo = _servicioDeGestionDePeriodos.ObtenerPeriodoPorId(id);
            if (periodo == null)
            {
                return NotFound();
            }
            return Ok(Mapper.Map<Periodo, PeriodoModel>(periodo));
        }

        [HttpPost()]
        [ResponseType(typeof(Periodo))]
        public IHttpActionResult Post(Periodo periodo)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            _servicioDeGestionDePeriodos.AgregarPeriodo(periodo);

            return CreatedAtRoute("DefaultApi", new { id = periodo.Id }, periodo);
        }

        [HttpPut()]
        public IHttpActionResult Put(int id, Periodo periodo)
        {
            if (!ModelState.IsValid)
            {
                return BadRequest(ModelState);
            }

            if (id != periodo.Id)
            {
                return BadRequest();
            }

            _servicioDeGestionDePeriodos.ModificarPeriodo(periodo);

            return StatusCode(HttpStatusCode.NoContent);
        }

        [HttpDelete()]
        [ResponseType(typeof(Periodo))]
        public IHttpActionResult Delete(int id)
        {
            Periodo periodo = _servicioDeGestionDePeriodos.ObtenerPeriodoPorId(id);
            if (periodo == null)
            {
                return NotFound();
            }

            _servicioDeGestionDePeriodos.EliminarPeriodo(periodo);

            return Ok(periodo);
        }
        
        private bool PeriodoExists(int id)
        {
            return _servicioDeGestionDePeriodos.ObtenerPeriodoPorId(id) != null;
        }


        [HttpGet()]
        [Route("api/periodos/GetPagedPeriodos/{pageIndex}/{pageSize}")]
        public IEnumerable<Periodo> GetPagedPeriodos(int pageIndex, int pageSize)
        {
            return _servicioDeGestionDePeriodos.ObtenerPeriodosPaginado(pageIndex, pageSize);
        }

        [HttpGet()]
        [Route("api/periodos/ObtenerPeriodosVigentes")]
        public IHttpActionResult ObtenerPeriodosVigentes()
        {
            return Ok(_servicioDeGestionDePeriodos.ObtenerPeriodosVigentes());
        }
    }
}
